// 自己封装的 Ajax 函数
function itheima(opt) {
  const xhr = new XMLHttpRequest()

  // 只要 load 事件被触发，就证明请求成功了
  xhr.addEventListener('load', function () {
    // 把请求到的数据，转换成真实的数据对象
    const result = JSON.parse(xhr.response)
    // 调用成功的回调函数，把请求回来的数据作为参数，传给 sucess 函数
    opt.success(result)
  })

  // 处理 params 查询参数
  // null  NaN  0  ''  undefined
  if (opt.params) {
    // 专门用来存储键值对字符串的空数组
    const qs = []
    // 循环 params 对象的每个属性，把生成的键值对存储到 qs 数组中
    for (let k in opt.params) {
      qs.push(`${k}=${opt.params[k]}`)
    }
    if (qs.length !== 0) {
      // opt.url += ('?' + qs.join('&'))
      opt.url += `?${qs.join('&')}`
    }
  }

  xhr.open(opt.method, opt.url)

  // 根据不同的条件，来发送对应的请求体
  if (opt.data) {
    // 证明：需要发送请求体
    // TODO：判断以什么格式，发送请求体的数据
    // 1. 发送 FormData 格式的请求体
    if (opt.data instanceof FormData) {
      // 注意：如果发送的是 FormData 格式的请求体，不需要设置编码格式
      // 因为 xhr 会自动把 Content-Type 设置为 multipart/form-data
      // 而且，还会自动生成一个分割线（这才是最主要的）
      xhr.send(opt.data)
      return
    }
    // 2. 发送“字符串格式”的请求体数据   k1=v1&k2=v2
    if (typeof opt.data === 'string') {
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      xhr.send(opt.data)
      return
    }
    // 3. 发送“JSON”格式的请求体数据
    if (typeof opt.data === 'object') {
      xhr.setRequestHeader('Content-Type', 'application/json')
      xhr.send(JSON.stringify(opt.data))
      return
    }
  } else {
    // 证明：不需要发送请求体
    xhr.send()
  }
}
